package com.blue.Impl.system;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.blue.common.constant.CommonConstant;
import com.blue.common.utils.RedisUtils;
import com.blue.mapper.system.DictMapper;
import com.blue.po.system.DictItemPO;
import com.blue.po.system.DictPO;
import com.blue.service.system.IDictItemService;
import com.blue.service.system.IDictService;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * <p>
 * 数据字典表 服务实现类
 * </p>
 *
 * @author 陈南杰
 * @since 2023-09-22
 */
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, DictPO> implements IDictService {
    @Autowired
    private IDictItemService dictItemService;

    @Autowired
    private RedisUtils redisUtils;

    @Transactional
    @Override
    public void delete(List<String> ids) {
        dictItemService.remove(new LambdaQueryWrapper<DictItemPO>()
                .in(DictItemPO::getDictId, ids));
        this.removeBatchByIds(ids);
    }

    @Override
    public List<DictItemPO> getByDictCode(String dictCode) {
        String key = "dict_key:" + dictCode;
        Object value = redisUtils.getValue(key);
        if (value == null) {
            MPJLambdaWrapper<DictItemPO> queryWrapper = JoinWrappers.lambda(DictItemPO.class)
                    .selectAll(DictItemPO.class)
                    .leftJoin(DictPO.class, DictPO::getId, DictItemPO::getDictId)
                    .eq(DictPO::getDictCode, dictCode)
                    .eq(DictPO::getStatus, CommonConstant.NORMAL)
                    .eq(DictItemPO::getStatus, CommonConstant.NORMAL);
            List<DictItemPO> dictItemPOS = dictItemService.list(queryWrapper);
            if (!CollectionUtils.isEmpty(dictItemPOS)) {
                String json = JSON.toJSONString(dictItemPOS);
                redisUtils.cacheValue(key, json, 60 * 10);
            }
            return dictItemPOS;
        } else {
            return JSON.parseArray(value.toString(), DictItemPO.class);
        }
    }

    @Override
    public DictItemPO getByDictCodeAndItemCode(String dictCode, String itemCode) {
        String key = "dict_key:" + dictCode + "-" + itemCode;
        Object value = redisUtils.getValue(key);
        if (value == null) {
            MPJLambdaWrapper<DictItemPO> queryWrapper = JoinWrappers.lambda(DictItemPO.class)
                    .selectAll(DictItemPO.class)
                    .leftJoin(DictPO.class, DictPO::getId, DictItemPO::getDictId)
                    .eq(DictPO::getDictCode, dictCode)
                    .eq(DictItemPO::getCode, itemCode)
                    .eq(DictPO::getStatus, CommonConstant.NORMAL)
                    .eq(DictItemPO::getStatus, CommonConstant.NORMAL);
            DictItemPO dictItemPO = dictItemService.getOne(queryWrapper);
            if (dictItemPO != null) {
                redisUtils.cacheValue(key, JSON.toJSONString(dictItemPO), 60 * 10);
            }
            return dictItemPO;
        } else {
            return JSON.parseObject(value.toString(), DictItemPO.class);
        }
    }
}
